/*
 * Gramatica.h
 *
 *  Created on: 22/11/2012
 *      Author: vagner
 */

#ifndef GRAMATICA_H_
#define GRAMATICA_H_
#include <vector>
#include <string>

namespace tp2ftcModel {

typedef std::string palavra;

typedef struct{
	std::string ladoEsquerdo;
	std::vector<std::string> ladoDireito;
}regra;

typedef std::string variavel;
typedef std::string terminal;
typedef std::vector<variavel> Variaveis;
typedef std::vector<terminal> Terminais;
typedef std::vector<regra> Regras;

class GramaticaModel {
private:
	Variaveis variaveis;
	Terminais terminais;
	Regras regras;
	variavel variavelPartida;
	//Procura uma variavel no lado direito de uma regra;
	inline bool isVariavelNaRegra(const regra& r, const variavel& v)const;
	inline void showRegra(const regra& r)const;
	//Verifica se uma regra já encontra-se cadastrada
	bool isRegraCadastrada(const regra& r);
	//Verifica se uma VARIAVEL já encontra-se cadastrada
	bool isVariavelCadastrada(const variavel& v);
	//Verifica se uma TERMINAL já encontra-se cadastrada
	bool isTerminalCadastrado(const terminal& t);//Compara duas regras retorno true se ambas são iguais e false caso contrário.
	bool comparaRegras(const regra& r1, const regra& r2) const;
	void removeVariavel(const variavel& v);
public:
	static const int REGRA_CADASTRADA_SUCESSO = 0;
	static const int REGRA_JA_CADASTRADA = 1;
	static const int VARIAVEL_CADASTRADA_SUCESSO = 2;
	static const int VARIAVEL_JA_CADASTRADA = 3;
	static const int TERMINAL_CADASTRADA_SUCESSO = 4;
	static const int TERMINAL_JA_CADASTRADO = 5;
	static const int REGRA_REMOVIDA_SUCESSO = 6;
	static const int REGRA_INEXISTENTE = 7;
	static const int VARIAVEL_REMOVIDA_SUCESSO = 8;
	static const int VARIAVEL_NAO_ENCONTRADA = 9;

	GramaticaModel();
	virtual ~GramaticaModel();
	//Insere uma variavel na gramatica
	int insereVariaveis(const variavel& v);
	//Exclui uma variavel removendo as regras ao qual ela pertence;
	int excluiVariavel (const variavel& v);
	//Retorna o conjunto de variaveis cadastradas na gramatica
	Variaveis getVariaveis(void)const;
	//Insere um terminal na gramatica
	int insereTerminal(const terminal& t);
	//Retorna os terminais cadastrados na gramatica
	Terminais getTerminais(void)const;
	int insereRegra(const regra& r);
	//Retorna o conjunto de regras cadastradas na Gramatica
	Regras getRegras(void)const;
	//Define uma variavel de partida
	void setVariavelPartida(const variavel& p);
	//Retorna variavel de partida cadastrada
	variavel getVariavelPartida (void)const;
	int excluiRegra(const regra& r);
	void excluiVariavelPartida();


};

} /* namespace tp2ftcModel */
#endif /* GRAMATICA_H_ */
